widget: Compare proper adjusted size to new size when allocating
authorTimm Bäder <mail@baedert.org>
Wed, 22 Jul 2020 05:10:59 +0000 (07:10 +0200)
committerTimm Bäder <mail@baedert.org>
Tue, 28 Jul 2020 03:34:11 +0000 (05:34 +0200)
We were comparing first but then still modifying the adjusted size later
on, leading to unnecessary resizes.

gtk/gtkwidget.c

index e02699a336451dcb8efe871942138af307a81f1d..1ff5ed00f9386316a055ef61a73afd2ce6117635 100644 (file)
@@ -3834,7 +3834,6 @@ gtk_widget_allocate (GtkWidget    *widget,
 
   gtk_widget_adjust_size_allocation (widget, &adjusted);
 
-  size_changed = (priv->width != adjusted.width) || (priv->height != adjusted.height);
 
   if (adjusted.width < 0 || adjusted.height < 0)
     {
@@ -3885,15 +3884,16 @@ gtk_widget_allocate (GtkWidget    *widget,
   if (priv->surface_transform_data)
     sync_widget_surface_transform (widget);
 
-  if (!alloc_needed && !size_changed && !baseline_changed)
-    goto skip_allocate;
-
   /* Since gtk_widget_measure does it for us, we can be sure here that
    * the given alloaction is large enough for the css margin/bordder/padding */
   adjusted.width -= border.left + padding.left +
                     border.right + padding.right;
   adjusted.height -= border.top + padding.top +
                      border.bottom + padding.bottom;
+  size_changed = (priv->width != adjusted.width) || (priv->height != adjusted.height);
+
+  if (!alloc_needed && !size_changed && !baseline_changed)
+    goto skip_allocate;
 
   priv->width = adjusted.width;
   priv->height = adjusted.height;